/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package utils;

//import ec.edu.ucuenca.negocio.controladores.CtrNovedades;
import java.sql.Timestamp;
import java.text.DateFormat;
//import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.faces.bean.ManagedBean;
//import java.util.logging.Level;
//import java.util.logging.Logger;

/**
 *
 * @author Elvia
 */
@ManagedBean
public class Fechas {

    private final String formatoFecha = "yyyy-MM-dd";
    private final String formatoFechaHora = "yyyy-MM-dd HH:mm:ss";
    //private final String formatoDia = "EEE";
    private final int ss = 3600;
    private final int mm = 60;
    private final int hh24 = 24;
    private final int hh12 = 12;
    private final int milseg = 1000;

    /**
     * Creado: Elvia Alvarez
     *
     * @return
     */
    public Date getFechaActual() {
        Date date = null;
        //crea un formato de fecha
        DateFormat myDateFormat = new SimpleDateFormat(formatoFecha);
        try {
            //toma la fecha del sistema de tipo Date - en un formato indicado
            date = myDateFormat.parse(myDateFormat.format(new java.util.Date()));

        } catch (java.text.ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * Creado: Elvia Alvarez
     *
     * @param fecha
     * @return
     */
    public Date getFechaActual(Date fecha) {
        Date date = null;
        //crea un formato de fecha
        DateFormat myDateFormat = new SimpleDateFormat("dd-MMM-yyyy");
        try {
            //toma la fecha del sistema de tipo Date - en un formato indicado
            date = myDateFormat.parse(myDateFormat.format(fecha));
        } catch (java.text.ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * Creado: Gabriela Nuñez
     *
     * @param fecha
     * @return
     */
    public Date getFechaFormatoFechaHH(Date fecha) {
        Date date = null;
        //crea un formato de fecha
        DateFormat myDateFormat = new SimpleDateFormat(formatoFechaHora);
        try {
            //toma la fecha del sistema de tipo Date - en un formato indicado
            date = myDateFormat.parse(myDateFormat.format(fecha));
        } catch (java.text.ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * Creado: Elvia Alvarez
     *
     * @return
     */
    public Timestamp getFechaHora() {
        java.util.Date today = new java.util.Date();
        return new java.sql.Timestamp(today.getTime());
    }

    /**
     * Creado: Elvia Alvarez
     *
     * @return
     */
    public Timestamp getFechaHoraActual() {
        Date date = null;
        //crea un formato de fecha
        DateFormat myDateFormat = new SimpleDateFormat(formatoFechaHora);
        try {
            //toma la fecha del sistema de tipo Date - en un formato indicado
            date = myDateFormat.parse(myDateFormat.format(new Date()));
        } catch (java.text.ParseException e) {
            e.printStackTrace();
        }
        return (Timestamp) date;
    }

    /**
     * Creado: Gabriela Núñez
     *
     * @return
     */
    public Timestamp getFechaHoraParam(Date fecha) {
        return new java.sql.Timestamp(fecha.getTime());
    }

    /**
     * Creado: Elvia Alvarez
     *
     * @return
     */
    public String getFechaActualStr() {
        Date fechaActual = new Date();
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
        String cadenaFecha = formato.format(fechaActual);
        return cadenaFecha;
    }

    /**
     * Creado: Gabriela Núñez
     *
     * @return una cadena convertida segun un formato de fecha
     */
    public String getFechaStrTimeStamp(Date d) {
        Timestamp ts;
        //ts = (Timestamp) d;
        SimpleDateFormat formato = new SimpleDateFormat("dd/mm/yyyy hh24:mi:ss,FF");
        String cadenaFecha = formato.format(d);
        return cadenaFecha;
    }

    /**
     * Creado: Elvia Alvarez
     *
     * @return
     */
    public String getFechaActualHmStr() {
        Date fechaActual = new Date();
        SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd: HH:mm:ss");
        String cadenaFecha = formato.format(fechaActual);
        return cadenaFecha;
    }

    /**
     * Creado: Elvia Alvarez
     *
     * @return
     */
    public String getFechaHoraActualStr() {
        Date fechaActual = new Date();
        SimpleDateFormat formato = new SimpleDateFormat(this.formatoFechaHora);
        String cadenaFecha = formato.format(fechaActual);
        return cadenaFecha;
    }

    /**
     * Creado: Elvia Alvarez
     *
     * @param d
     * @return
     */
    public String getFechaStr(Date d) {
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
        String cadenaFecha = formato.format(d);
        return cadenaFecha;
    }

    /**
     * Creado: Elvia Alvarez
     *
     * @param fecha
     * @return la fecha en el formato indicado, como string
     */
    public String getFechaStr2(Date d) {
        SimpleDateFormat formato = new SimpleDateFormat("EEEEE dd MMMMM yyyy");
        String cadenaFecha = formato.format(d);
        return cadenaFecha;
    }

    /**
     * Creado: Elvia Alvarez
     *
     * @param fecha
     * @return fecha en un formato indicado
     */
    public Date getFechaFormato(Date fecha) {
        Date date = null;
        //crea un formato de fecha
        DateFormat myDateFormat = new SimpleDateFormat(formatoFecha);
        try {
            //toma la fecha del sistema de tipo Date - en un formato indicado
            date = myDateFormat.parse(myDateFormat.format(fecha));
        } catch (java.text.ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    public Date getFechaStrDate(String fecha) {
        Date date = null;
        String formato = "ddd MMM dd hh:mm:ss ECT yyyy";
        //crea un formato de fecha
        DateFormat myDateFormat = new SimpleDateFormat(formato);
        try {
            //toma la fecha del sistema de tipo Date - en un formato indicado
            date = myDateFormat.parse(myDateFormat.format(fecha));
        } catch (java.text.ParseException e) {
            e.printStackTrace();
        }
        return date;

        //  this.selNovedad.setFechaInicia(dfm.parse(dfm2.format(selNovedad.getFechaInicia())+" "+this.horaInicio+":00"));
    }

    /**
     * Creado: Elvia Alvarez
     *
     * @param fecha
     * @return fecha en un formato indicado
     */
    public Date getFechaFormato1(Date fecha) {
        Date date = null;
        //crea un formato de fecha
        DateFormat myDateFormat = new SimpleDateFormat("dd/MM/yyyy");
        try {
            //toma la fecha del sistema de tipo Date - en un formato indicado
            date = myDateFormat.parse(myDateFormat.format(fecha));
        } catch (java.text.ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * Creado: Gabriela Núñez
     *
     * @param fechaInicio, fechafin
     * @return un valor segun el tipo de conversion que se aplique. Numero de
     * dias, segundos, horas o minutos
     */
    public long getTimeConversionFechas(Date fInicio, Date fFin, int sConversion) {
        try {

            Date fechaFI, fechaFF;
            long lValorConversion; //Recuperar el numero de dias

            switch (sConversion) {
                case 1:
                    lValorConversion = ss * hh24 * milseg;
                    //dias
                    break;
                case 2:
                    lValorConversion = ss * milseg;
                    //horas
                    break;
                case 3:
                    lValorConversion = mm * milseg;
                    //minutos
                    break;
                case 4:
                    lValorConversion = milseg;
                    //segundos
                    break;
                default:
                    lValorConversion = 1;
                    break;
            }

            Calendar calendarFI = Calendar.getInstance();
            calendarFI.setTime(fInicio);

            fechaFI = calendarFI.getTime();

            Calendar calendarFF = Calendar.getInstance();
            calendarFF.setTime(fFin);

            fechaFF = calendarFF.getTime();
            return (fechaFF.getTime() - fechaFI.getTime()) / lValorConversion;
        } catch (Exception e) {
            return 0;
        }
    }

    /**
     * Creado: Gabriela Núñez
     *
     * @param número de dias y fecha
     * @return fecha de recuperar la suma del numero de dias a la fecha
     * ingresada
     */
    public Date getSumaDiaAFecha(int numDias, Date fecha) {
        try {
            SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
            Calendar c = Calendar.getInstance();
            c.setTime(fecha);
            c.add(Calendar.DATE, numDias); //le suma 25 días                           
            return c.getTime();
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * Creado: Gabriela Núñez
     *
     * @param segundos y fecha
     * @return una fecha. Suma a una fecha los segundos ingresados
     */
    public Date getSumaSegudosAFecha(int segundos, Date fecha) {
        try {
            Calendar cs = Calendar.getInstance();
            cs.setTime(fecha);
            cs.add(Calendar.SECOND, segundos);
            return cs.getTime();
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * Creado: Gabriela Núñez
     *
     * @param segundos y hora
     * @return Recupera el numero de segunods de hh:ss
     */
    public int calcularSegundosDeHora(int hora, int segundos) {
        //formato hh:ss
        try {
            return (hora * ss) + (segundos * mm);
        } catch (Exception e) {
            return 0;
        }

    }

    /**
     * Creado: Gabriela Núñez
     *
     * @param días
     * @return recupera segundos de dias ingresados por parametro
     */
    public long calcularSegundosDeDias(long dias) {
        //formato dias = dd (5 dias)
        try {
            return (hh24 * ss * dias);
        } catch (Exception e) {
            return 0;
        }

    }

    /**
     * Creado: Gabriela Núñez
     *
     * @param fecha y hora
     * @return recupera una fecha de concatenar los parametros fecha y hora
     */
    public Date concatenarFechaHora(Date fecha, String hora) {
        try {
            DateFormat dfm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            DateFormat dfm2 = new SimpleDateFormat(formatoFecha);
            return dfm.parse(dfm2.format(fecha) + " " + hora + ":00");

        } catch (Exception e) {
            return null;
        }
    }

    /**
     * Creado: Gabriela Núñez
     *
     * @param fecha y hora
     * @return recupera una fecha de concatenar los parametros fecha y hora
     */
    public Date caststrFecha(String fecha) {
        try {
            DateFormat dfm = new SimpleDateFormat("dd/MM/yy HH:mm:ss");
            //DateFormat dfm2 = new SimpleDateFormat(formatoFecha);                                
//                return dfm.parse(dfm2.format(fecha) + " " + hora + ":00");             
            return dfm.parse(fecha);

        } catch (Exception e) {
            return null;
        }
    }

    public String getStrTimeStamp(Date fecha) {
        try {
            DateFormat formato = new SimpleDateFormat("dd/MM/yy HH:mm:ss");
            String cadenaFecha = formato.format(fecha) + ",000000000";
            return cadenaFecha;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * Creado: Gabriela Núñez
     *
     * @param fecha
     * @return recupera un string en el formato "hh24:mm" de 24 horas.
     */
    public String getstrHH24mmDate(Date fecha) {
        Calendar cs = Calendar.getInstance();
        cs.setTime(fecha);
        return String.format("%02d", cs.get(Calendar.HOUR_OF_DAY)) + ":" + String.format("%02d", cs.get(Calendar.MINUTE));
    }

    /**
     * Creado: Elvia Alvarez
     *
     * @param fecha1, fecha2
     * @return : retorna un numero que 0 cuando son iguales, >0 cuando la fecha1
     * es mayor a la fecha2, <0 cuando fecha1 es menor a fecha2
     */
    public int comparaFechas(Date fecha1, Date fecha2) {
        int valor;
        valor = fecha1.compareTo(fecha2);
        return valor;
    }

    public String horafromDate(Date fecha) {
        //Pongo la hora y minutos Inicial
        Calendar calendar = GregorianCalendar.getInstance(); // creates a new calendar instance
        calendar.setTime(fecha);   // assigns calendar to given date 
        int horat = calendar.get(Calendar.HOUR);        // gets hour in 12h format
        int minut = calendar.get(Calendar.MINUTE);        // gets hour in 12h format

        return horat + ":" + minut;
    }

    /**
     * Creado: Cristian Montero
     *
     * @return el dia de la semana que representa una fecha en formato LUN, MAR,
     * MIE, etc
     */
    public String getDia(Date d) {
        Timestamp ts;
        //ts = (Timestamp) d;
        SimpleDateFormat formato = new SimpleDateFormat("EEE");
        String cadenaFecha = formato.format(d);
        return cadenaFecha;
    }

    /**
     * Creado: Elvia Alvarez
     *
     * @param fecha
     * @param formato
     * @return
     */
    public static String formatoFechas(Timestamp fecha, String formato) {
        return new SimpleDateFormat(formato).format(fecha);

    }

    public boolean fechas(Timestamp fecha, String horaParametro) {
        boolean retorno = false;
        try {

            Date fechaRecivida = new Date(fecha.getTime());

            String[] hm = horaParametro.split(":");
            int horas = Integer.parseInt(hm[0]);
            int minutos = Integer.parseInt(hm[1]);

            Calendar calendar2 = Calendar.getInstance();
            calendar2.add(Calendar.MINUTE, -minutos);
            calendar2.add(Calendar.HOUR, -horas);
            Date fechaMaxima = calendar2.getTime();

            int resultado = comparaFechas(fechaRecivida, fechaMaxima);
            if (resultado < 0) {
                retorno = true;
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return retorno;
    }

    private long beginTime;
    private long endTime;

    //POngo las fechas de inicio y final para la generación:
    public void ponerFechasRandom(String fechaInicio,String fechaFin) {
        beginTime = Timestamp.valueOf(fechaInicio+" 00:00:00").getTime();
        endTime = Timestamp.valueOf(fechaFin+" 00:58:00").getTime();
    }

    //Genero las fechas:
    public Date genRandomTimeEntreFechas() {
        long diff = endTime - beginTime + 1;
        long res= beginTime + (long) (Math.random() * diff);
        Date date = new Date(res);
        return date;
    }

    public long getBeginTime() {
        return beginTime;
    }

    public void setBeginTime(long beginTime) {
        this.beginTime = beginTime;
    }

    public long getEndTime() {
        return endTime;
    }

    public void setEndTime(long endTime) {
        this.endTime = endTime;
    }

    
    
    
}
